﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using PraxisRent.Entities;
using PraxisRent.BL;
using Microsoft.Practices.Unity;

namespace PraxisRent.UI
{
    public partial class FrmMttoAlquiler : Form
    {
        [Dependency]
        public IAlquilerBL alquilerBL { get; set; }

        [Dependency]
        public ITipoComprobanteBL tipCompBL { get; set; }

        [Dependency]
        public ITipoPagoBL tipPagoBL { get; set; }

        [Dependency]
        public IEquipoBL equipoBL { get; set; }

        [Dependency]
        public IClienteJuridicoBL cliJuriBL { get; set; }

        [Dependency]
        public IClienteNaturalBL cliNatBL { get; set; }

        [Dependency]
        public IObraBL obraBL { get; set; }

        public FrmMttoAlquiler()
        {
            InitializeComponent();
            this.BuilUp();
        }

        bool isNew;
        int idTipComprobante;
        int idTipPago;

        List<EQUIPO> _listEquipoPorAsignar;

        public void NuevoAlquiler()
        {
            isNew = true;
            aLQUILERBindingSource.AddNew();

            cboxTComprobante.DataSource = tipCompBL.GetAllFromTipoComprobante();
            cboxTPago.DataSource = tipPagoBL.GetAllFromTipoPago();
        }

        public ALQUILER _alquiler { get; set; }

        public void EditarAlquiler()
        {
            aLQUILERBindingSource.DataSource = _alquiler;

            cboxTComprobante.DataSource = tipCompBL.GetAllListFromTipoComprobanteByCriterio(_alquiler.TipoComprobanteId);
            cboxTPago.DataSource = tipPagoBL.GetAllListFromTipoPagoByCriterio(_alquiler.TipoPagoId);

            var cliJuri = (from c in cliJuriBL.GetAllFromClienteJuridico()
                           where c.ClienteJuridicoId.Equals(_alquiler.CodigoCliente)
                           select c).SingleOrDefault();
            var cliNat = (from c in cliNatBL.GetAllFromClienteNatural()
                          where c.ClienteNaturalId.Equals(_alquiler.CodigoCliente)
                          select c).SingleOrDefault();
            if (cliJuri != null)
            {
                txtRucDni.Text = cliJuri.Ruc;
                txtCliente.Text = cliJuri.RazonSocial;
            }
            else if (cliNat != null)
            {
                txtRucDni.Text = cliNat.Dni;
                txtCliente.Text = cliNat.NombreCompleto;
            }
        }

        private void FrmMttoAlquiler_Load(object sender, EventArgs e)
        {
            cargaEquipos();

            _listEquipoPorAsignar = new List<EQUIPO>();
        }

        public void cargaEquipos()
        {
            if (rbtnMaquinaria.Checked == true)
            {
                eQUIPOBindingSource.DataSource = equipoBL.GetALlFromEquipoByTipoMaquinariaDisponibles();
            }
        }

        private void rbtnMaquinaria_CheckedChanged(object sender, EventArgs e)
        {
            if (rbtnMaquinaria.Checked == true)
            {
                eQUIPOBindingSource.DataSource = equipoBL.GetALlFromEquipoByTipoMaquinariaDisponibles();
            }
            else if (rbtnEquipo.Checked == true)
            {
                eQUIPOBindingSource.DataSource = equipoBL.GetALlFromEquipoByTipoEquipoDisponibles();
            }
        }

        //boton buscar EQUIPOS
        private void btnBuscar_Click(object sender, EventArgs e)
        {
            if (rbtnMaquinaria.Checked == true)
            {
                eQUIPOBindingSource.DataSource = equipoBL.GetAllFromEquipoOfMaquinariasDisponibles(TxtCriterio.Text);
            }
            else if (rbtnEquipo.Checked == true)
            {
                eQUIPOBindingSource.DataSource = equipoBL.GetAllFromEquipoOfEquiposDisponibles(TxtCriterio.Text);
            }
        }

        private void TxtCriterio_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (rbtnMaquinaria.Checked == true)
                {
                    eQUIPOBindingSource.DataSource = equipoBL.GetAllFromEquipoOfMaquinariasDisponibles(TxtCriterio.Text);
                }
                else if (rbtnEquipo.Checked == true)
                {
                    eQUIPOBindingSource.DataSource = equipoBL.GetAllFromEquipoOfEquiposDisponibles(TxtCriterio.Text);
                }
            }
        }

        private void cboxTPago_Click(object sender, EventArgs e)
        {
            cboxTPago.DataSource = tipPagoBL.GetAllFromTipoPago();
        }

        private void cboxTComprobante_Click(object sender, EventArgs e)
        {
            cboxTComprobante.DataSource = tipCompBL.GetAllFromTipoComprobante();
        }

        private void cboxTPago_SelectedValueChanged(object sender, EventArgs e)
        {
            if (cboxTPago.SelectedValue != null)
            {
                var a = (from c in tipPagoBL.GetAllFromTipoPagoByCriterio(cboxTPago.SelectedValue.ToString())
                         select c.Id).SingleOrDefault();

                idTipPago = a;
            }
        }

        private void cboxTComprobante_SelectedValueChanged(object sender, EventArgs e)
        {
            if (cboxTComprobante.SelectedValue != null)
            {
                var a = (from c in tipCompBL.GetAllFromTipoComprobanteByCriterio(cboxTComprobante.SelectedValue.ToString())
                         select c.Id).SingleOrDefault();

                idTipComprobante = a;
            }
        }

        public void VerificarExistenciaCliente()
        {
            var clienteJuri = cliJuriBL.GetAllFromClienteJuridicoByRuc(txtRucDni.Text);
            var clienteNat = cliNatBL.GetAllFromClienteNaturalByDni(txtRucDni.Text);
            var alquiler = aLQUILERBindingSource.Current as ALQUILER;
            if (txtRucDni.Text.Length == 8 || txtRucDni.Text.Length == 11)
            {
                if (clienteJuri != null)
                {
                    alquiler.CodigoCliente = clienteJuri.ClienteJuridicoId;
                    txtCliente.Text = clienteJuri.RazonSocial;
                    aLQUILERBindingSource.ResetBindings(true);
                }
                else if (clienteNat != null)
                {
                    alquiler.CodigoCliente = clienteNat.ClienteNaturalId;
                    txtCliente.Text = clienteNat.NombreCompleto;
                    aLQUILERBindingSource.ResetBindings(true);
                }
                else
                {
                    var rpt = MessageBox.Show(this, "Cliente NO Existente ¿Desea Crear un Cliente?", "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (rpt == DialogResult.Yes)
                    {
                        FrmMttoCliente frm = new FrmMttoCliente();
                        frm.ShowDialog();
                    }
                }
            }
            else
            {
                MessageBox.Show("Longitud Ruc o Dni Incorrectos", "Mensaje", MessageBoxButtons.OK);
            }
        }

        private void txtRucDni_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                VerificarExistenciaCliente();
            }
        }

        private void txtRucDni_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
                VerificarExistenciaCliente();
            }
        }

        private void txtRucDni_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsNumber(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        public void cargaCliente()
        {
            FrmCliente frm = new FrmCliente();
            frm.Extend();
            frm.ShowDialog();

            if (frm.currentClienteJuridico != null)
            {
                var nuevoClienteJuri = cliJuriBL.GetAllFromClienteJuridicoByRuc(frm.currentClienteJuridico.Ruc);
                var alquiler = aLQUILERBindingSource.Current as ALQUILER;
                alquiler.CodigoCliente = nuevoClienteJuri.ClienteJuridicoId;
                txtCliente.Text = nuevoClienteJuri.RazonSocial;
                txtRucDni.Text = nuevoClienteJuri.Ruc;
                aLQUILERBindingSource.ResetBindings(true);
            }
            else if (frm.currentClienteNtural != null)
            {
                var nuevoClienteNat = cliNatBL.GetAllFromClienteNaturalByDni(frm.currentClienteNtural.Dni);
                var alquiler = aLQUILERBindingSource.Current as ALQUILER;
                alquiler.CodigoCliente = nuevoClienteNat.ClienteNaturalId;
                txtCliente.Text = nuevoClienteNat.NombreCompleto;
                txtRucDni.Text = nuevoClienteNat.Dni;
                aLQUILERBindingSource.ResetBindings(true);
            }
        }

        public void cargaObra()
        {
            FrmObra frm = new FrmObra();
            frm.Extend();
            frm.ShowDialog();

            if (frm.currentObra != null)
            {
                var nuevaObra = obraBL.GetAllFRomObraByCodigo(frm.currentObra.Codigo);
                var alquiler = aLQUILERBindingSource.Current as ALQUILER;
                alquiler.CodigoObra = nuevaObra.Codigo;
                alquiler.OBRA = nuevaObra;
                aLQUILERBindingSource.ResetBindings(true);
            }
        }

        // cargando datos CLIENTE con boton extendido
        private void btnBusCliente_Click(object sender, EventArgs e)
        {
            cargaCliente();
        }

        // cargando datos OBRA con boton extendido
        private void btnBusObra_Click(object sender, EventArgs e)
        {
            cargaObra();
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            var equipos = eQUIPOBindingSource.Current as EQUIPO;
            var currentAlquiler = aLQUILERBindingSource.Current as ALQUILER;

            if (equipos != null)
            {
                var detalle = new DETALLE_ALQUILER
                {
                    CodigoAlquiler = currentAlquiler.Codigo,
                    CodigoEquipo = equipos.Codigo,
                    EQUIPO = equipos,
                    ALQUILER = currentAlquiler,
                    NumHoras=1,
                    PrecioPorHora = equipos.PrecioPorHora
                };

                var existe = currentAlquiler.DETALLE_ALQUILER.Where(d => d.EQUIPO.Codigo.Equals(equipos.Codigo)).SingleOrDefault();

                if (existe == null)
                {
                    currentAlquiler.DETALLE_ALQUILER.Add(detalle);
                    currentAlquiler.Monto = currentAlquiler.DETALLE_ALQUILER.Sum(dp => dp.PrecioPorHora);
                }
                else
                {
                    MessageBox.Show(detalle.EQUIPO.Nombre + " ya se encuentra agregado", "Mensaje", MessageBoxButtons.OK);
                }

                _listEquipoPorAsignar.Add(equipos);
                aLQUILERBindingSource.ResetBindings(true);
                dETALLE_ALQUILERBindingSource.ResetBindings(true);
            }
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            var detalleAlquiler = dETALLE_ALQUILERBindingSource.Current as DETALLE_ALQUILER;
            var alquiler = aLQUILERBindingSource.Current as ALQUILER;

            if (detalleAlquiler != null)
            {
                var rpt = MessageBox.Show(this, string.Format("¿Desea Quitar el Equipo: {0} ?", detalleAlquiler.EQUIPO.Nombre), "Quitar Equipo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (rpt == DialogResult.Yes)
                {
                    dETALLE_ALQUILERBindingSource.RemoveCurrent();
                    calcularTotal();

                    //cambiar disponibilidad del equipo
                    if (detalleAlquiler.EQUIPO.Disponible == false)
                    {
                        detalleAlquiler.EQUIPO.Disponible = true;
                        equipoBL.UpdateEquipo(detalleAlquiler.EQUIPO);
                        cargaEquipos();
                    }
                }
            }
            else
            {
                MessageBox.Show("Debe selecionar un equipo para poder Quitar");
            }
            aLQUILERBindingSource.ResetBindings(true);
            dETALLE_ALQUILERBindingSource.ResetBindings(true);
        }

        public void calcularTotal()
        {
            var _alquiler = aLQUILERBindingSource.Current as ALQUILER;

            if (_alquiler != null)
            {
                _alquiler.Monto = _alquiler.DETALLE_ALQUILER.Sum(dp => dp.Monto);
                aLQUILERBindingSource.ResetBindings(true);
            }
        }

        private void dETALLE_ALQUILERDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 1 || e.ColumnIndex == 2)
            {
                var detalle = dETALLE_ALQUILERBindingSource.Current as DETALLE_ALQUILER;
                var equipo = new EQUIPO();

                if (detalle != null)
                {
                    equipo = equipoBL.GetAllFRomEquipoById(detalle.CodigoEquipo);

                    if (detalle.NumHoras <= 0)
                    {
                        MessageBox.Show("Numero de Horas debe ser mayor a 0", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        detalle.NumHoras = 1;
                    }
                    calcularTotal();
                }
            }
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            var alquiler = aLQUILERBindingSource.Current as ALQUILER;

            var msg = "ERROR";

            if (alquiler != null)
            {
                if (isNew == true)
                {
                    try
                    {
                        alquiler.FechaDevolucion = fechaDevolucionDateTimePicker.Value;
                        alquiler.FechaEntrega = fechaEntregaDateTimePicker.Value;
                        alquiler.TipoComprobanteId = idTipComprobante;
                        alquiler.TipoPagoId = idTipPago;
                        alquiler.Cancelado = false;
                        alquilerBL.AddAlquiler(alquiler);

                        foreach (var item in alquiler.DETALLE_ALQUILER)
                        {
                            item.EQUIPO.Disponible = false;
                            equipoBL.UpdateEquipo(item.EQUIPO);
                        }

                        MessageBox.Show("Registro Correcto, su Codigo de Alquiler es: " + alquiler.Codigo, "Registro",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();

                        FrmMttoCredito frm = new FrmMttoCredito();
                        frm._alquiler = alquiler;
                        frm.nuevoCreditoByAlquiler();
                        frm.ShowDialog();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                if (isNew == false)
                {
                    try
                    {
                        alquiler.FechaDevolucion = fechaDevolucionDateTimePicker.Value;
                        alquiler.FechaEntrega = fechaEntregaDateTimePicker.Value;
                        alquiler.TipoComprobanteId = idTipComprobante;
                        alquiler.TipoPagoId = idTipPago;
                        alquiler.Cancelado = false;
                        alquilerBL.UpdateAlquiler(alquiler);

                        foreach (var item in alquiler.DETALLE_ALQUILER)
                        {
                            var equipo = (from c in equipoBL.GetAllFromEquipo()
                                          where c.Codigo.Equals(item.CodigoEquipo)
                                          select c).SingleOrDefault();

                            item.EQUIPO = equipo;

                            if (item.EQUIPO.Disponible == true)
                            {
                                item.EQUIPO.Disponible = false;
                                equipoBL.UpdateEquipo(item.EQUIPO);
                            }
                        }

                        MessageBox.Show("Modificación Correcta", "Registro",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }
    }
}
